#include<iostream>
#include<functional>
#include<string>
//using namespace std;


//void ShowList()
//{
//	cout << endl;
//}
//
//template<class T, class ...Args>
//void ShowList(T val,Args...args)
//{ 
//	cout << val << " ";
//	ShowList(args...);
//}
//
//template<class ...Args>
//void CppPrint(Args...args)
//{
//	ShowList(args...);
//}
//
//int main()
//{
//	CppPrint();
//	CppPrint(1);
//	CppPrint(1,2);
//	CppPrint(1,2,3);
//	CppPrint(1,2,3,4);
//	CppPrint(1,2,3,4,5);
//	return 0;
//}

//template<class T>
//void PrintArgs(T t)
//{
//	cout <<t<< " ";
//}
//
//template< class ...Args>
//void ShowList(Args...args)
//{
//	int a[] = { (PrintArgs(args),3)... };
//	cout << endl;
//}
//
//
//
//int main()
//{
//	ShowList(1);
//	ShowList(1, 'A');
//	ShowList(1, 'A', std::string("aaa"));
//	return 0;
//}

//template<class T,class F>
//T func(T t, F f)
//{
//	static int cnt = 2;
//	cout <<"cnt: " << cnt++ << endl;
//	cout <<"&cnt: " << &cnt << endl;
//	return f(t);
//}
//
//int A(int i)
//{
//	return  i+1;
//}
//
//struct H
//{
//	int operator()(int i)
//	{
//		return i + 3;
//	}
//};
//
//class B
//{
//public:
//	static int Add(int i)
//	{
//		return i + 8;
//	}
//};
//
//
//int main()
//{
//	/*cout << func(2, A) << endl;
//	cout << func(3, H())<<endl;
//	cout << func(4,[](int i)->int {return i + 6; });*/
//	function<int(int)> f1 =A;
//	cout << func(2, f1) << endl;
//	function<int(int)> f2 = H();
//	cout << func(3, f2) << endl;
//	function<int(int)> f3 = [](int i)->int {return i + 6; };
//	cout << func(4, f3) << endl;;
//
//	function<int(int)> f4 = &B::Add;
//	cout << func(4, f4)<<endl;
//
//
//	return 0;
//}

//int Add(int x, int y)
//{
//	return x + y;
//}
//
//class Sub
//{
//public:
//	static int sub(int x, int y)
//	{
//		return x - y;
//	}
//};
//
//int main()
//{
//	
//	Sub s;
//	std::function<int(int, int)> func1 = std::bind(&Sub::sub,std::placeholders::_1, std::placeholders::_2);
//	std::cout << func1(1, 2) << std::endl;;
//
//	/*auto func2 = std::bind(&Sub::sub, s, std::placeholders::_1, std::placeholders::_2);
//	std::cout << func2(1, 2) << std::endl;;
//
//	auto func3 = std::bind(&Sub::sub, s, std::placeholders::_2, std::placeholders::_1);
//	std::cout << func3(1, 2) << std::endl;;*/
//
//
//	//std::function<int(int, int)> func1 = std::bind(Add, std::placeholders::_1, std::placeholders::_2);
//	//std::cout << func1(1, 2) << std::endl;;
//	//
//	//auto func2 = std::bind(Add, std::placeholders::_2, std::placeholders::_1);
//	//std::cout << func1(1, 2) << std::endl;
//
//	//auto func3 = std::bind(Add, 1, 2);
//	//std::cout << func3() << std::endl;
//
//
//	return 0;
//}

class Person
{
public:
	Person(std::string name="Peter", int age=10)
		:name_(name),age_(age)
	{
	}
	Person(const Person& p)
		:name_(p.name_)
		,age_(p.age_)
	{}
	Person& operator=(const Person& p)
	{
		if(this != &p)
		{
			name_=p.name_;
			age_ = p.age_;
		}
		return *this;
	}

	/*Person(Person&& p) = default;*/
	Person(Person&& p) = delete;

	~Person()
	{ }
private:
	std::string name_;
	int age_;
};

int main()
{
	Person s1;
	Person s2 = s1;
	Person s3 = std::move(s1);
	Person s4;
	s4 = std::move(s2);

	return 0;
}